
package com.gitee.sop.layui.adminserver.module.background.admin.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gitee.sop.layui.adminserver.module.background.admin.entity.SysMenu;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author: admin
 * @date: 2019-11-14
 * @version: 1.0.0
 */
public interface SysMenuMapper extends BaseMapper<SysMenu> {

    /**
     * 查询指定用户的可用菜单
     *
     * @param appId                  应用id
     * @param userUuid               用户uuid
     * @param status                 菜单状态：可选值：0 ，1 ；可为空
     * @param showMode               菜单展示模式：可选值为：VERTICAL , LEVEL 可为空
     * @param menuFlag               菜单类型
     * @param treeGroup              树分组 ；当树参数都不为空时，进行子菜单匹配 ；
     * @param treeLevel              树层级 ；当树参数都不为空时，进行子菜单匹配 ；
     * @param treeLeftTraverseNumber 树左遍历序号 ；当树参数都不为空时，进行子菜单匹配 ；
     * @return
     */
    List<SysMenu> selectListBy(@Param("appId") String appId, @Param("userUuid") String userUuid
            , @Param("status") Integer status, @Param("showMode") String showMode, @Param("menuFlag") Integer menuFlag
            , @Param("treeGroup") String treeGroup, @Param("treeLevel") Integer treeLevel, @Param("treeLeftTraverseNumber") Integer treeLeftTraverseNumber);

    /**
     * 查询指定用户的所有的菜单，并使用pid排序
     *
     * @param creatorUuid 创建用户
     * @param appId       应用id
     * @return
     */
    List<SysMenu> selectAllAndOrderByPidSortByCreatorUuidAndAppId(@Param("creatorUuid") String creatorUuid, @Param("appId") String appId);

    /**
     * 获取指定菜单角色的菜单列表
     *
     * @param roleUuid 菜单角色id
     * @param appId    应用id
     * @return
     */
    List<SysMenu> selectListByRoleUuid(@Param("appId") String appId, @Param("roleUuid") String roleUuid);

    /**
     * 查实指定用户的创建的数据
     *
     * @param creatorUuid 数据创建用户
     * @param appId       应用id
     * @return
     */
    List<SysMenu> selectAllByCreatorUuid(@Param("appId") String appId, @Param("creatorUuid") String creatorUuid);

    /**
     * 删除指定uuid的菜单
     *
     * @param appId    应用id
     * @param uuidList uuid列表
     */
    void deleteByUuid(@Param("appId") String appId, @Param("uuidList") List<String> uuidList);

    /**
     * 获取指定uuid的数据
     *
     * @param appId    应用id
     * @param uuidList uuid列表
     * @return
     */
    List<SysMenu> selectListByUuid(@Param("appId") String appId, @Param("uuidList") List<String> uuidList);

    /**
     * 获取指定菜单信息
     *
     * @param appId      应用id
     * @param menuIdList 菜单id列表
     * @return
     */
    List<SysMenu> selectListByIds(@Param("appId") String appId, @Param("menuIdList") List<Integer> menuIdList);

    /**
     * 在插入节点前，更新插入节点后，树的节点变化情况
     *
     * @param treeGroup              插入节点的根节点树分组
     * @param treeLeftTraverseNumber 插入节点的根节点树左遍历序号
     */
    void updateTreeInfoAtInsert(@Param("treeGroup") String treeGroup, @Param("treeLeftTraverseNumber") int treeLeftTraverseNumber);

    /**
     * 在删除节点前，更新删除节点后，树的节点变化情况
     *
     * @param treeGroup              删除节点根节点节点树分组
     * @param treeLeftTraverseNumber 删除节点根节点树左遍历序号
     * @param count                  删除节点个数
     */
    void updateTreeInfoAtDelete(@Param("treeGroup") String treeGroup, @Param("treeLeftTraverseNumber") int treeLeftTraverseNumber, @Param("count") int count);

    /**
     * 查询指定树分组，指定层级，指定遍历序号的所有子节点
     *
     * @param treeGroup              树分组
     * @param treeLevel              树层级
     * @param treeLeftTraverseNumber 树左遍历序号
     * @return
     */
    List<SysMenu> selectChildListTreeBy(@Param("treeGroup") String treeGroup, @Param("treeLevel") int treeLevel, @Param("treeLeftTraverseNumber") int treeLeftTraverseNumber);

    /**
     * 查询指定应用，指定分组，指定层级的最后一个孩子节点
     *
     * @param appId
     * @param treeGroup
     * @param treeLeftTraverseNumber
     * @return
     */
    SysMenu selectChildMaxSortBy(@Param("appId") String appId, @Param("treeGroup") String treeGroup, @Param("treeLeftTraverseNumber") int treeLeftTraverseNumber);

    /**
     * 查询第一层级指定名称指定创建用户指定应用的数据
     *
     * @param appId        应用id
     * @param creatorUuid  创建用户
     * @param menuNameList 菜单名称列表
     * @return
     */
    List<SysMenu> selectTopListByAppIdAndCreatorUuidAndNames(@Param("appId") String appId, @Param("creatorUuid") String creatorUuid, @Param("menuNameList") List<String> menuNameList);

    /**
     * 查询指定uuid的菜单
     *
     * @param menuUuid
     * @return
     */
    SysMenu selectByUuid(@Param("menuUuid") String menuUuid);

    /**
     * 查询指定应用的菜单信息
     *
     * @param appId
     * @return
     */
    List<SysMenu> selectByAppId(@Param("appId") String appId);
}
